package com.itheima.service.imlp;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.Mapper.SetmealMapper;
import com.itheima.dto.SetmealDto;
import com.itheima.entity.Setmeal;
import com.itheima.entity.SetmealDish;
import com.itheima.exection.DeleteByIdDishCustomExection;
import com.itheima.service.ISetmealService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class SetmealServiceImpl
        extends ServiceImpl<SetmealMapper, Setmeal>
        implements ISetmealService{


    @Autowired
    private SetmealDishServiceImpl setmealDishService;



//      接口5：新增套餐接口
//      备注：套餐表：setmeal   套餐菜品关系表： setmeal_dish
//      请求url地址：/setmeal
//      请求方式：POST
//      请求参数：JSON格式参数 怎么封装？？ Setmeal ？还是 SetmealDish ? 都不是 创建一个新的实体类：SetmealDto 来封装
    @Override
    public void saveWithDish(SetmealDto setmealDto) {
//        因为新增涉及到了两个表,此处就需要对针对于DTO的内容,分别对两个表进行新增处理
//        ps:DTO在数据库中不存在,因此,这里只能把DTO拆分成Setmeal和SetmealDish,再进行添加
//        DTO继承Setmeal,因此,该表中有Setmeal所有的属性
//        DTO创建了SetmealDish的引用类型,因此可以从表中引出该内容


//        先处理Setmeal内容
        this.save(setmealDto);
//        SetmealDish中缺少setmealId信息,这里需要进行两个表的绑定
//        SetmealDish属于套餐菜品,一个套餐可以对应多个菜品,因此,此处需要进行多表处理


//        获取SetmealDish数据表,并进行处理,将ID添加进去
        List<SetmealDish> setmealDishList = setmealDto.getSetmealDishes().stream().map(setmealDish -> {
            Long setmealId = setmealDto.getId();
            setmealDish.setSetmealId(setmealId);
            return setmealDish;
        }).collect(Collectors.toList());

        setmealDishService.saveBatch(setmealDishList);

    }


//      接口三：删除套餐
//      请求url地址：/setmeal ?ids=1415580119015145474,1505375213336915969
//      请求方式：DELETE
//      请求参数：?ids=1415580119015145474,1505375213336915969
//      响应结果【格式统一】：R 对象
    @Override
    public void removeWithDish(List<Long> ids) {
//        此处需要对两个表进行删除操作
//        套餐表是单体,直接删除
//        判断当前套餐是不是属于售卖状态,售卖状态不能删除
        LambdaQueryWrapper<Setmeal> setmealwrapper = new LambdaQueryWrapper<>();
        setmealwrapper.in(Setmeal::getId,ids);
        setmealwrapper.eq(Setmeal::getStatus,1);
        int count = this.count(setmealwrapper);
        if (count>0){
            throw new DeleteByIdDishCustomExection("当前套餐处于销售状态,停售后才能删除.");
        }

//        如果可以删除,就直接删除
        this.removeByIds(ids);

//        套餐菜品表是多条数据
//        需要进行逻辑判断
        LambdaQueryWrapper<SetmealDish> wrapper = new LambdaQueryWrapper<>();
        wrapper.in(SetmealDish::getSetmealId,ids);
        setmealDishService.remove(wrapper);

    }


//      接口四：起售/停售套餐
//      请求url地址：/setmeal/status/**1**
//      请求方式：POST
//      请求参数： ?ids=1415580119015145474,1505375213336915969

    @Override
    public void statusWithUpdate(Integer id, List<Long> ids) {
//
//        LambdaQueryWrapper<Setmeal> wrapper = new LambdaQueryWrapper<>();
//        wrapper.in(Setmeal::getId,ids);

        LambdaUpdateWrapper<Setmeal> wrapper = new LambdaUpdateWrapper<>();
        wrapper.in(Setmeal::getId,ids);
        Setmeal setmeal = new Setmeal();
        if (id>0){
            setmeal.setStatus(1);
            this.update(setmeal,wrapper);
            return;
        }
        setmeal.setStatus(0);
        this.update(setmeal,wrapper);
    }


//      接口五：修改套餐
//      接口1：根据套餐id查询套餐数据
//      请求url地址：/setmeal/1415580119015145474
//      请求方式：GET
//      请求参数： rest风格参数
//      响应结果【格式统一】：R<SetmealDto> 对象

    //    此处回显操作
    @Override
    public SetmealDto DTOWithUpdate(Long id) {
//        此处需要对两个表进行操作
//        套餐表直接获取内容返回
        Setmeal setmeal = this.getById(id);

//        获取套餐菜品信息
        LambdaQueryWrapper<SetmealDish> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SetmealDish::getSetmealId,id);
        List<SetmealDish> setmealDish = setmealDishService.list(wrapper);

//        整合数据
        SetmealDto setmealDto = new SetmealDto();
        BeanUtils.copyProperties(setmeal,setmealDto);
        setmealDto.setSetmealDishes(setmealDish);

        return setmealDto;


    }


//      接口2：修改套餐
//      请求url地址：/setmeal
//      请求方式：PUT
//      请求参数：JSON格式数据，使用 SetmealDto 封装
    @Override
    public void SetmealDTOWithUpdate(SetmealDto setmealDto) {
//        此处对两个表的数据进行处理
//        套餐表属于单表,不需要特殊处理
        this.updateById(setmealDto);
        Long setmealId = setmealDto.getId();
//        套餐菜品表需要特殊处理
//        该表本身就是属于多次处理的那种,不考虑长久存储,采用删除新增的方式进行处理

        LambdaQueryWrapper<SetmealDish> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SetmealDish::getSetmealId,setmealId);
        setmealDishService.remove(wrapper);

//        继续新增,给SetmealDish表中setmealId 进行赋值

        List<SetmealDish> setmealDishList = setmealDto.getSetmealDishes().stream().map(setmealDish -> {
            setmealDish.setSetmealId(setmealId);
            return setmealDish;
        }).collect(Collectors.toList());
//        批量增加
        setmealDishService.saveBatch(setmealDishList);
    }
}
